import json
import logging
import logging.config
import os
from pathlib import Path

class LoggerManager:
    """
    日志管理器，负责从JSON配置文件加载日志配置并创建日志器
    """
    
    def __init__(self, config_path="./logger_config.json"):
        """
        初始化日志管理器
        
        Args:
            config_path (str): 日志配置文件路径
        """
        self.config_path = config_path
        self._setup_logging()
    
    def _setup_logging(self):
        """设置日志配置"""
        if os.path.exists(self.config_path):
            with open(self.config_path, 'r', encoding='utf-8') as f:
                config = json.load(f)
                
            # 确保日志文件所在目录存在
            for handler in config.get('handlers', {}).values():
                if 'filename' in handler:
                    log_file = handler['filename']
                    log_dir = os.path.dirname(log_file)
                    if log_dir and not os.path.exists(log_dir):
                        os.makedirs(log_dir)
            
            # 应用配置
            logging.config.dictConfig(config)
        else:
            # 如果配置文件不存在，使用默认配置
            self._setup_default_logging()
            
    def _setup_default_logging(self):
        """设置默认日志配置"""
        logging.basicConfig(
            level=logging.INFO,
            format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
        )
        logging.warning(f"日志配置文件 {self.config_path} 不存在，使用默认配置")
    
    def get_logger(self, name=None):
        """
        获取指定名称的日志器
        
        Args:
            name (str, optional): 日志器名称，如果为None则返回根日志器
            
        Returns:
            logging.Logger: 日志器实例
        """
        return logging.getLogger(name)
    
    def update_config(self, new_config):
        """
        更新日志配置
        
        Args:
            new_config (dict): 新的日志配置字典
        """
        with open(self.config_path, 'w', encoding='utf-8') as f:
            json.dump(new_config, f, indent=4)
        
        # 重新加载配置
        self._setup_logging()


# 创建全局日志管理器实例
logger_manager = LoggerManager()


def get_logger(name=None):
    """
    获取日志器的便捷函数
    
    Args:
        name (str, optional): 日志器名称
        
    Returns:
        logging.Logger: 日志器实例
    """
    return logger_manager.get_logger(name)
